// admin/system/handler/sys_menu_handler.go
package handler

import (
	"go-admin1/admin/system/model"
	"go-admin1/admin/system/service"
	"go-admin1/internal/common/utils"
	"strconv"

	"github.com/gin-gonic/gin"
)

// SysMenuHandler 菜单处理器
type SysMenuHandler struct {
	menuService service.SysMenuService
}

// NewSysMenuHandler 创建菜单处理器实例
func NewSysMenuHandler(menuService service.SysMenuService) *SysMenuHandler {
	return &SysMenuHandler{
		menuService: menuService,
	}
}

// Create 创建菜单
func (h *SysMenuHandler) Create(c *gin.Context) {
	var menu model.SysMenu
	if err := c.ShouldBindJSON(&menu); err != nil {
		utils.FailResponse[string](c, "参数解析失败: "+err.Error())
		return
	}

	if err := h.menuService.Create(&menu); err != nil {
		utils.FailResponse[string](c, "创建菜单失败: "+err.Error())
		return
	}
	utils.OkResponseNoDataWithMessage[string](c, "创建菜单成功")
}

// GetByID 根据ID获取菜单
func (h *SysMenuHandler) GetByID(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		utils.FailResponse[string](c, "参数解析失败: "+err.Error())
		return
	}

	menu, err := h.menuService.GetByID(id)
	if err != nil {
		utils.FailResponse[string](c, "无菜单信息: "+err.Error())
		return
	}
	utils.OkResponse(c, menu)
}

// Update 更新菜单
func (h *SysMenuHandler) Update(c *gin.Context) {
	var menu model.SysMenu
	if err := c.ShouldBindJSON(&menu); err != nil {
		utils.FailResponse[string](c, "参数解析失败: "+err.Error())

		return
	}

	if err := h.menuService.Update(&menu); err != nil {
		utils.FailResponse[string](c, "更新菜单失败: "+err.Error())

		return
	}
	utils.OkResponseNoDataWithMessage[string](c, "更新菜单成功")
}

// Delete 删除菜单
func (h *SysMenuHandler) Delete(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		utils.FailResponse[string](c, "参数解析失败: "+err.Error())
		return
	}

	if err := h.menuService.Delete(id); err != nil {
		utils.FailResponse[string](c, "删除菜单失败: "+err.Error())
		return
	}
	utils.OkResponseNoDataWithMessage[string](c, "删除菜单成功")
}

// List 菜单列表
func (h *SysMenuHandler) List(c *gin.Context) {
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))

	menus, total, err := h.menuService.List(page, pageSize)
	if err != nil {
		utils.FailResponse[string](c, "获取菜单列表失败: "+err.Error())
		return
	}
	resultData := map[string]interface{}{
		"list":  menus,
		"total": total,
	}
	utils.OkResponse(c, resultData)
}

// ListAll 所有菜单列表
func (h *SysMenuHandler) ListAll(c *gin.Context) {
	menus, err := h.menuService.ListAll()
	if err != nil {
		utils.FailResponse[string](c, "获取菜单列表失败: "+err.Error())

		return
	}
	utils.OkResponse(c, menus)
}

// ListByParentID 根据父ID获取菜单列表
func (h *SysMenuHandler) ListByParentID(c *gin.Context) {
	parentIDStr := c.Query("parentID")
	parentID, err := strconv.ParseInt(parentIDStr, 10, 64)
	if err != nil {
		utils.FailResponse[string](c, "参数解析失败: "+err.Error())
		return
	}

	menus, err := h.menuService.ListByParentID(parentID)
	if err != nil {
		utils.FailResponse[string](c, "获取菜单列表失败: "+err.Error())
		return
	}
	utils.OkResponse(c, menus)
}

// ListByRoleID 根据角色ID获取菜单列表
func (h *SysMenuHandler) ListByRoleID(c *gin.Context) {
	roleIDStr := c.Query("roleID")
	roleID, err := strconv.ParseInt(roleIDStr, 10, 64)
	if err != nil {
		utils.FailResponse[string](c, "参数解析失败: "+err.Error())
		return
	}

	menus, err := h.menuService.ListByRoleID(roleID)
	if err != nil {
		utils.FailResponse[string](c, "获取菜单列表失败: "+err.Error())
		return
	}
	utils.OkResponse(c, menus)
}
